package br.com.vertigo.sgci.entity;

// Generated 15/10/2008 18:19:42 by Hibernate Tools 3.2.2.GA

import static javax.persistence.GenerationType.IDENTITY;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;

import br.com.vertigo.sgci.session.Constants;

/**
 * Rdv generated by hbm2java
 */
@SuppressWarnings("serial")
@Entity
@Table(name = "rdv", catalog = "sgci_project")
public class Rdv implements java.io.Serializable {

	private Long idRdv;
	private Usuario usuario;
	private Projeto projeto;
	private Date dataSolicitacao;
	private Date dataAprovacao;
	private Date dataRejeicao;
	private Date dataPagamento;
	private Date dataIndeferimento;
	private Date dataAvaliacaoGerencia;
	private Date dataAvaliacaoFinanceiro;
	private boolean isEmCorrecao;
	private double valor;
	private double valorReembolso;
	private double valorTotalDespesa;
	private double valorTotalReembolso;
	private String situacao;
	private String motivoRejeicaoIndeferimento;
	private String observacao;
	private Set<Itemrdv> itemrdvs = new HashSet<Itemrdv>(0);
	private Set<Itemrdv> itemrdvsTrasient = new HashSet<Itemrdv>(0);
	

	public Rdv() {
	}

	public Rdv(Usuario usuario, Projeto projeto,
			Date dataSolicitacao, Date dataAprovacao, Date dataRejeicao,
			Date dataPagamento, Date dataIndeferimento, Date dataAvaliacaoGerencia, 
			Date dataAvaliacaoFinanceiro, boolean isEmCorrecao,
			double valor, double valorReembolso, double valorTotalDespesa, double valorTotalReembolso,
			String situacao, String motivoRejeicaoIndeferimento, String observacao) {
		this.usuario = usuario;
		this.projeto = projeto;
		this.dataSolicitacao = dataSolicitacao;
		this.dataAprovacao = dataAprovacao;
		this.dataRejeicao = dataRejeicao;
		this.dataPagamento = dataPagamento;
		this.dataIndeferimento = dataIndeferimento;
		this.dataAvaliacaoGerencia = dataAvaliacaoGerencia;
		this.dataAvaliacaoFinanceiro = dataAvaliacaoFinanceiro;
		this.isEmCorrecao = isEmCorrecao;
		this.valor = valor;
		this.valorReembolso = valorReembolso;
		this.valorTotalDespesa = valorTotalDespesa;
		this.valorTotalReembolso = valorTotalReembolso;
		this.situacao = situacao;
		this.motivoRejeicaoIndeferimento = motivoRejeicaoIndeferimento;
		this.observacao = observacao;
	}

	public Rdv(Usuario usuario, Projeto projeto,
			Date dataSolicitacao, Date dataAprovacao, Date dataRejeicao,
			Date dataPagamento, Date dataIndeferimento, Date dataAvaliacaoGerencia, 
			Date dataAvaliacaoFinanceiro, boolean isEmCorrecao,
			double valor, double valorReembolso, double valorTotalDespesa, double valorTotalReembolso,
			String situacao, String motivoRejeicaoIndeferimento, String observacao, 
			Set<Itemrdv> itemrdvs, Set<Itemrdv> itemrdvsTrasient) {
		this.usuario = usuario;
		this.projeto = projeto;
		this.dataSolicitacao = dataSolicitacao;
		this.dataAprovacao = dataAprovacao;
		this.dataRejeicao = dataRejeicao;
		this.dataPagamento = dataPagamento;
		this.dataIndeferimento = dataIndeferimento;
		this.dataAvaliacaoGerencia = dataAvaliacaoGerencia;
		this.dataAvaliacaoFinanceiro = dataAvaliacaoFinanceiro;
		this.isEmCorrecao = isEmCorrecao;
		this.valor = valor;
		this.valorReembolso = valorReembolso;
		this.valorTotalDespesa = valorTotalDespesa;
		this.valorTotalReembolso = valorTotalReembolso;
		this.situacao = situacao;
		this.itemrdvs = itemrdvs;
		this.motivoRejeicaoIndeferimento = motivoRejeicaoIndeferimento;
		this.observacao = observacao;
		this.itemrdvsTrasient = itemrdvsTrasient;
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "ID_RDV", unique = true, nullable = false)
	public Long getIdRdv() {
		return this.idRdv;
	}

	public void setIdRdv(Long idRdv) {
		this.idRdv = idRdv;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_USUARIO", nullable = false)
	@NotNull
	public Usuario getUsuario() {
		return this.usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_PROJETO", nullable = false)
	@NotNull
	public Projeto getProjeto() {
		return this.projeto;
	}

	public void setProjeto(Projeto projeto) {
		this.projeto = projeto;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DATA_SOLICITACAO", nullable = false, length = 19)
	@NotNull
	public Date getDataSolicitacao() {
		return this.dataSolicitacao;
	}

	public void setDataSolicitacao(Date dataSolicitacao) {
		this.dataSolicitacao = dataSolicitacao;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DATA_APROVACAO", nullable = true, length = 19)
	public Date getDataAprovacao() {
		return this.dataAprovacao;
	}

	public void setDataAprovacao(Date dataAprovacao) {
		this.dataAprovacao = dataAprovacao;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DATA_REJEICAO", nullable = true, length = 19)
	public Date getDataRejeicao() {
		return this.dataRejeicao;
	}

	public void setDataRejeicao(Date dataRejeicao) {
		this.dataRejeicao = dataRejeicao;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DATA_PAGAMENTO", nullable = true, length = 19)
	public Date getDataPagamento() {
		return this.dataPagamento;
	}

	public void setDataPagamento(Date dataPagamento) {
		this.dataPagamento = dataPagamento;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DATA_INDEFERIMENTO", nullable = true, length = 19)
	public Date getDataIndeferimento() {
		return this.dataIndeferimento;
	}

	public void setDataIndeferimento(Date dataIndeferimento) {
		this.dataIndeferimento = dataIndeferimento;
	}

	@Column(name = "IS_EM_CORRECAO", nullable = false)
	@NotNull
	public boolean isIsEmCorrecao() {
		return this.isEmCorrecao;
	}

	public void setIsEmCorrecao(boolean isEmCorrecao) {
		this.isEmCorrecao = isEmCorrecao;
	}

	@Column(name = "VALOR", nullable = false, precision = 22, scale = 0)
	@NotNull
	public double getValor() {
		return this.valor;
	}

	public void setValor(double valor) {
		this.valor = valor;
	}
	
	@Column(name = "VALOR_REEMBOLSO", nullable = false, precision = 22, scale = 0)
	@NotNull
	public double getValorReembolso() {
		return this.valorReembolso;
	}

	public void setValorReembolso(double valorReembolso) {
		this.valorReembolso = valorReembolso;
	}
	
	@Column(name = "MOTIVO_REJEI_INDEF", nullable = true, length = 65535)
	@Length(max = 65535)
	public String getMotivoRejeicaoIndeferimento() {
		return this.motivoRejeicaoIndeferimento;
	}

	public void setMotivoRejeicaoIndeferimento(String motivoRejeicaoIndeferimento) {
		this.motivoRejeicaoIndeferimento = motivoRejeicaoIndeferimento;
	}
	
	@Column(name = "OBSERVACAO", nullable = true, length = 65535)
	@Length(max = 65535)
	public String getObservacao() {
		return this.observacao;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "rdv")
	public Set<Itemrdv> getItemrdvs() {
		return this.itemrdvs;
	}

	public void setItemrdvs(Set<Itemrdv> itemrdvs) {
		this.itemrdvs = itemrdvs;
	}
	
	@Transient
	public Set<Itemrdv> getItemrdvsTransient() {
		return this.itemrdvsTrasient;
	}

	public void setItemrdvsTransient(Set<Itemrdv> itemrdvsTrasient) {
		this.itemrdvsTrasient = itemrdvsTrasient;
	}

	@Transient
	public String getSituacao() {
		if(this.isEmCorrecao){
			setSituacao(Constants.SITUACAO_RDV_PENDENTE_CORRECAO);
		}else if(this.dataIndeferimento != null){
			setSituacao(Constants.SITUACAO_RDV_INDEFERIDO);
		}else if(this.dataPagamento != null){
			setSituacao(Constants.SITUACAO_RDV_PAGAMENTO_EFETUADO);
		}else if(this.dataRejeicao != null){
			setSituacao(Constants.SITUACAO_RDV_SOLICITACAO_REJEITADA);
		}else if(this.dataAprovacao != null){
			setSituacao(Constants.SITUACAO_RDV_PENDENTE_PAGAMENTO);
		}else{
			setSituacao(Constants.SITUACAO_RDV_PENDENTE_APROVACAO);
		}
		
		return this.situacao;
	}

	public void setSituacao(String situacao) {
		this.situacao = situacao;
	}

	@Transient
	public Date getDataAvaliacaoGerencia() {
		setDataAvaliacaoGerencia(this.dataAprovacao != null ? this.dataAprovacao : this.dataRejeicao);
		return dataAvaliacaoGerencia;
	}

	public void setDataAvaliacaoGerencia(Date dataAvaliacaoGerencia) {
		this.dataAvaliacaoGerencia = dataAvaliacaoGerencia;
	}

	@Transient
	public Date getDataAvaliacaoFinanceiro() {
		setDataAvaliacaoFinanceiro(this.dataPagamento != null ? this.dataPagamento : this.dataIndeferimento);
		return dataAvaliacaoFinanceiro;
	}

	public void setDataAvaliacaoFinanceiro(Date dataAvaliacaoFinanceiro) {
		this.dataAvaliacaoFinanceiro = dataAvaliacaoFinanceiro;
	}

	@Transient
	public double getValorTotalDespesa() {
		return valorTotalDespesa;
	}

	public void setValorTotalDespesa(double valorTotalDespesa) {
		this.valorTotalDespesa = valorTotalDespesa;
	}

	@Transient
	public double getValorTotalReembolso() {
		return valorTotalReembolso;
	}

	public void setValorTotalReembolso(double valorTotalReembolso) {
		this.valorTotalReembolso = valorTotalReembolso;
	}
}
